--
-- Created by IntelliJ IDEA.
-- User: zhanpu
-- Date: 20-10-30
-- Time: 下午4:11
-- To change this template use File | Settings | File Templates.
-- (Token bucket)令牌桶算法流量限制
--

-- 获取限流key
local limitKey = KEYS[1]
-- 获取参数1，周期窗口内限流大小并转换成功number
local limit = tonumber(ARGV[1])
-- 获取参数2，周期窗口时长，单位秒并转换成功number
local time = tonumber(ARGV[2])
-- 获取参数3，当前毫秒数
local currentTimeMillis = tonumber(ARGV[3])

-- 将周期窗口时长，单位秒转换成毫秒数
local timeMillis = time * 1000
-- 当前毫秒数 - 周期窗口时长毫秒数 = 开始周期毫秒数
local startTimeMillis = currentTimeMillis - timeMillis

-- 根据key从redis中获取数据，获取开始周期时间到当前时间的流量大小
local currentLimit = tonumber(redis.call('ZCOUNT', limitKey, startTimeMillis, currentTimeMillis) or '0')

-- 检验是否超出限制大小，超出返回
if currentLimit + 1 > limit then
    return 0;
else
    -- 未超出，redis自增加1并
    redis.call('ZADD', limitKey, currentTimeMillis)
    -- 返回值
    return currentLimit + 1;
end
